Показано с 1 по 3 из 3

Тема: [MZ]DKR_UsefulPictures

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Бывалый Аватар для Darchan Kaen
    Информация о пользователе
    Регистрация
    17.06.2013
    Адрес
    Одесса
    Сообщений
    851
    Записей в дневнике
    3
    Репутация: 47 Добавить или отнять репутацию

    По умолчанию [MZ]DKR_UsefulPictures

    Название плагина: DKR_UsefulPictures

    Автор: DarchanKaen

    Версия: 2.0

    Дата выхода:
    Версия 2.0 - 22.01.2022

    Описание плагина:
    Плагин позволяет использовать картинки дополнительнымы способами, а именно - вызывает Общие события при:
    1. Ховере (наведении) над картинкой.
    2. ЛКМ на картинке.
    3. При перемещении картинки после ЛКМ (реализован примитивный "Драг-н-дроп") на специальную картинку-"дропзону".
    4. ПКМ (не привязано к картинке).
    5. Клик колеса мыши ("МКМ"; не привязано к картинке").
    Может быть полезен для мини-игр, пазлов, боёвок, поинт-н-клик игр.

    Для полноценного использования нужно самое базовое знание JavaScript (создание и исп-е массивов и объектов)!

    Плагин работает ТОЛЬКО с компьютерной мышью! С геймпадом и тачскрином смартфона плагин не работает.

    Видео работы плагина (из демки):
    Спойлер Тык:




    Нюансы:
    0. Плагин не совместим с другими плагинами на мышь, даже моими.
    1. Удаление картинки не равно удалению ее настроек или дропзоны - они удаляются вызовом скрипта!
    2. Картинка может быть ИЛИ "Полезной картинкой" ИЛИ "Дропзоной" - не одновременно!
    3. Для корректно работы плагина после загрузки файла сохранения - используйте плагин Galv`а на вызов Общего события после загрузки.
    4. В ПКМ стразу встроено отмена выбранной картинки для перемещения.
    5. Плагин работает ТОЛЬКО вне боя.
    6. Плагин предоставляет базовую функциональность драг-н-дропа картинок и одним только его включением "Покер" сделать не получится.


    Использование плагина:
    Параметры плагина
    Переменные для хранения списков Картинок, Дропзон, Пересечений; переключатели для хранения статуса работы мыши и доступности перемещений картинок;
    номера общих события для ПКМ и МКМ (нажатие на колёсико мыши); номера переменных для хранения статистики

    Команды (в эвенте, в команде "Скрипт")
    DKR.UsefulPictures.disableLRMC();- отключает стандартное поведения мыши, НУЖНО ЗАПУСКАТЬ ДЛЯ РАБОТЫ ПЛАГИНА!.
    DKR.UsefulPictures.enableLRMC();- включает стандартное поведение мыши.
    DKR.UsefulPictures.setCommonEventToRMC(ceId); - задает Общее событие для ПКМ.
    DKR.UsefulPictures.setCommonEventToMMC(ceId); - задает Общее события для МКМ.
    DKR.UsefulPictures.testUsefulPics(); - выводит на консоль перечень настроенных картинок.
    DKR.UsefulPictures.createUsefulPic(picSettings); - создает настроенную картинку с заданными настройками.
    DKR.UsefulPictures.getUsefulPic(usefulPicId); - возвращает настройки картинки с указанным номером.
    DKR.UsefulPictures.updateUsefulPic(usefulPicId, listOfSettingsToUpdate); - обновляет указанные настройки картинки с указанным номером.
    DKR.UsefulPictures.deleteUsefulPic(usefulPicId); - удаляет настройку картинку с указанным номером.
    DKR.UsefulPictures.testDropzone(); - выводит на консоль перечень дропзон.
    DKR.UsefulPictures.createDropZone(dropzoneSettings ); - создает настроенную картинку с заданными настройками.
    DKR.UsefulPictures.getDropZone(dropzoneId); - возвращает дропзону с указанным номером.
    DKR.UsefulPictures.updateDropZone(dropzoneId, listOfSettingsToUpdate); - обновляет указанные настройки дропзоны с указанным номером.
    DKR.UsefulPictures.deleteDropZone(dropzoneId); - удаляет дропзону с указанным номером.
    DKR.UsefulPictures.testVault(); - выводит на консоль список пересечений картинок и дропзон.
    DKR.UsefulPictures.isUsefulPicOnDropzones(usefulPi cId, logicOrIndex); - для получения информации, находится ли указанная картинка хоть на какой-нибудь дропзоне; возвращает true/false или номер дропзоны (-1, при негативном результате).
    DKR.UsefulPictures.isUsefulPicOnConcreteDropzone(u sefulPicId, dropzoneId); - для получения информации, находится ли указанная картинка на конкретной дропзоне; возвращает true/false.
    DKR.UsefulPictures.getUsefulPicsFromDropzone(dropz oneId); - возвращает массив с перечнем настроек картинок, что находятся на указанной дропзоне; может вернуть пустой массив.
    где
    ceId - номер Общего события; если 0 или -1, то событие не вызывется.
    picSettings - структура настроек картинки.
    usefulPicId - номер картинки.
    listOfSettingsToUpdate - массив настроек для обновления картинки / дропзоны (['имя настройки', новое значение]).
    dropzoneSettings - структура настроект дрозпоны.
    dropzoneId - номер картинки-дропзоны.
    logicOrIndex - тип запрашиваемого значения; может быть 'logic' или 'index'.

    Спойлер Примеры настроек Картинок и Дропзон (важно!):

    Для понимания - обязательно откройте демо редактором и просмотрите!
    Настройки картинок
    Код:
    		let picSettings = {
    			id: 1,
    			mark: '',
    			isHoverable: true,
    			onHoverCommonEventId: 32,
    			isClickableLeft: true,
    			onLeftClickCommonEventId: 33,
    			isMovable: true,
    			moveSpeed: 60,
    			onDropzoneCommonEventId: 37
    		}
    Настройки дропзон
    Код:
    let dropzoneSettings = {
    			id: 1,
    			mark: '',
    			dropState: 'active'
    			dropType: 'free'
    			dropAfter: 'work'
    			onDropCommonEventId: 35
    		}


    Код:
    Спойлер Версия 2.0:

    Код:
    var Imported = Imported || {};
    Imported.DKR_UsefulPictures = true;
    
    var DKR = DKR || {};          
    DKR.UsefulPictures = DKR.UsefulPictures || {}; 
    DKR.UsefulPictures.version = 2.0;
    
    //-----------------------------------------------------------------------------
    /*:
     * @plugindesc (v.2.0.0) Плагин позволяет использовать картинки дополнительнымы способами, а именно: вызывать Общее событие по ховеру, ЛКМ, примитивному "дран-н-дропу".
     * 
     * @target MZ
     * @author DarchanKaen
     *
     * @help
     *   DKR UsefulPictures
     * ----------------------------------------------------------------------------
     * ---Общая информация:
     * Плагин позволяет использовать картинки дополнительнымы способами, 
     *  а именно - вызывает Общие события при:
     *  1. Ховере над картинкой.
     *  2. ЛКМ на картинке.
     *  3. При перемещении картинки после ЛКМ (реализован примитивный "Драг-н-дроп") на специальную картинку-"дропзону".
     *  4. ПКМ (не привязано к картинке).
     *  5. Клик колеса мыши ("МКМ"; не привязано к картинке").
     *  Плагин НЕ СОВМЕСТИМ с другими плагинами на мышь!
     *  Подробнее - смотри на rpgmaker.su в теме плагинов.
     * ---Команды(в эвенте команда "Скрипт"):
     * DKR.UsefulPictures.disableLRMC(); - отключает стандартное поведения мыши, НУЖНО ЗАПУСКАТЬ ДЛЯ РАБОТЫ ПЛАГИНА!.
     * DKR.UsefulPictures.enableLRMC(); - включает стандартное поведение мыши.
     * DKR.UsefulPictures.setCommonEventToRMC(ceId); - задает Общее событие для ПКМ.
     * DKR.UsefulPictures.setCommonEventToMMC(ceId); - задает Общее события для МКМ.
     * DKR.UsefulPictures.testUsefulPics(); - выводит на консоль перечень настроенных картинок.
     * DKR.UsefulPictures.createUsefulPic(picSettings); - создает настроенную картинку с заданными настройками.
     * DKR.UsefulPictures.getUsefulPic(usefulPicId); - возвращает настройки картинки с указанным номером.
     * DKR.UsefulPictures.updateUsefulPic(usefulPicId, listOfSettingsToUpdate); - обновляет указанные настройки картинки с указанным номером.
     * DKR.UsefulPictures.deleteUsefulPic(usefulPicId); - удаляет настройку картинку с указанным номером.
     * DKR.UsefulPictures.testDropzone(); - выводит на консоль перечень дропзон.
     * DKR.UsefulPictures.createDropZone(dropzoneSettings  ); - создает настроенную картинку с заданными настройками.
     * DKR.UsefulPictures.getDropZone(dropzoneId); - возвращает дропзону с указанным номером.
     * DKR.UsefulPictures.updateDropZone(dropzoneId, listOfSettingsToUpdate); - обновляет указанные настройки дропзоны с указанным номером.
     * DKR.UsefulPictures.deleteDropZone(dropzoneId); - удаляет дропзону с указанным номером.
     * DKR.UsefulPictures.testVault(); - выводит на консоль список пересечений картинок и дропзон.
     * DKR.UsefulPictures.isUsefulPicOnDropzones(usefulPi  cId, logicOrIndex); - для получения информации, находится ли указанная картинка хоть на какой-нибудь дропзоне; возвращает true/false или номер дропзоны (-1, при негативном результате).
     * DKR.UsefulPictures.isUsefulPicOnConcreteDropzone(u  sefulPicId, dropzoneId); - для получения информации, находится ли указанная картинка на конкретной дропзоне; возвращает true/false.
     * DKR.UsefulPictures.getUsefulPicsFromDropzone(dropz  oneId) - возвращает массив с перечнем настроек картинок, что находятся на указанной дропзоне; может вернуть пустой массив.
    где
     * ceId - номер Общего события; если 0 или -1, то событие не вызывется.
     * picSettings - структура настроек картинки.
     * usefulPicId - номер картинки.
     * listOfSettingsToUpdate - массив настроек для обновления картинки / дропзоны (['имя настройки', новое значение]).
     * dropzoneSettings - структура настроект дрозпоны.
     * dropzoneId - номер картинки-дропзоны.
     * logicOrIndex - тип запрашиваемого значения; может быть 'logic' или 'index'.
     * 
     * ДЛЯ ПОНИМАНИЯ СТРУКТУРЫ НАСТРОЕК КАРТИНКИ И ДРОПЗОНЫ - ОТКРОЙКТЕ ПЛАГИН БЛОКНОТОМ И НАЙДИТЕ "SETTINGS STRUCTURES".
     * ПОДРОБНЕЕ - СМОТРИ ДЕМКУ на rpgmaker.su В ТЕМЕ ПЛАГИНА!
     * ----------------------------------------------------------------------------
     *
     * @param defaultLRMCWorkSwitchId
     * @type number
     * @desc Номер переключателя, хранящего статус стандартной / нестандартной работы мыши. Не для ручного переключения. (НЕОБХОДИМ!)
     * @default 12
     *
     * @param usefulPicturesListVarId
     * @type variable
     * @desc Номер переменной для сохранения Списка картинок (НЕБХОДИМ!)
     * @default 71
     *
     * @param dropzonesListVarId
     * @type variable
     * @desc Номер переменной для сохранения Списка дропзон (НЕБХОДИМ!)
     * @default 72
      *
     * @param vaultListVarId
     * @type variable
     * @desc Номер переменной для сохранения Списка пересечений картинок и дропзон 
     * @default 73
     *
     * @param movableSwitchId
     * @type number
     * @desc Номер переключателя, позволяющего движение картинок
     * @default 13
     *
     * @param rightMouseClickEventId
     * @type number
     * @desc Номер Общего события на ПКМ
     * @default 34
     *
     * @param middleMouseClickEventId
     * @type number
     * @desc Номер Общего события на МКМ (колёсико)
     * @default 36
     *
     * @param lastHoveredPicVarId
     * @type variable
     * @desc Номер переменной для хранения номера картинки, по которой последний раз был Ховер
     * @default 65
     *
     * @param lastClickedPicVarId
     * @type variable
     * @desc Номер переменной для хранения номера картинки, по которой последний раз был клик ЛКМ
     * @default 66
     *
     * @param lastMovedPicVarId
     * @type variable
     * @desc Номер переменной для хранения номера картинки, по которая последний раз перемещалась
     * @default 67
     *
     * @param lastDroppedPicVarId
     * @type variable
     * @desc Номер переменной для хранения номера картинки, которая последний раз помещалась в дропзону
     * @default 68
     *
     * @param lastUsedDropzoneVarId
     * @type variable
     * @desc Номер переменной для хранения номера дропзоны, на которую в послдний раз перемещалась картинка
     * @default 69
     *
     *
     */
    
    
    
    //UNCOMPABILE WTH PRIMITIVE BUTTON! BUT WORK WITH DEFAULT TEXT BUTTON!
    ( () => {
    	
    	
    	
    //----DATA: BEGIN	
    	//---params
    	DKR.UsefulPictures.parameters = PluginManager.parameters('DKR_UsefulPictures');
    	
    	let defaultLRMCWorkSwitchId = Number(DKR.UsefulPictures.parameters["defaultLRMCWorkSwitchId"]);
    	let usefulPicturesListVarId = Number(DKR.UsefulPictures.parameters["usefulPicturesListVarId"]);
    	let dropzonesListVarId = Number(DKR.UsefulPictures.parameters["dropzonesListVarId"]);
    	let vaultListVarId = Number(DKR.UsefulPictures.parameters["vaultListVarId"]);
    
    	let rightMouseClickEventId = Number(DKR.UsefulPictures.parameters["rightMouseClickEventId"]);
    	let middleMouseClickEventId = Number(DKR.UsefulPictures.parameters["middleMouseClickEventId"]);
    	
    	let movableSwitchId = Number(DKR.UsefulPictures.parameters["movableSwitchId"]);
    	
    	let lastHoveredPicVarId = Number(DKR.UsefulPictures.parameters["lastHoveredPicVarId"]);
    	let lastClickedPicVarId = Number(DKR.UsefulPictures.parameters["lastClickedPicVarId "]);
    	let lastMovedPicVarId = Number(DKR.UsefulPictures.parameters["lastMovedPicVarId"]);
    	let lastDroppedPicVarId = Number(DKR.UsefulPictures.parameters["lastDroppedPicVarId"]);
    	let lastUsedDropzoneVarId = Number(DKR.UsefulPictures.parameters["lastUsedDropzoneVarId"]);
    	
    	//--inner data
    	let pictureToMoveId = -1;
    	let pictureToMoveSpeed = -1;
    	let touchedDropzoneId = -1;
    	
    	const picToMoveOrigin = 0;
    	const picToMoveScaleX = 100;
    	const picToMoveScaleY = 100;
    	const picToMoveOpacity = 255;
    	const picToMoveBlendMode = 0;
    	
    	const DROPZONE_TYPE_LOCK_CODEWORD = 'lock';
    	const DROPZONE_STATE_SLEEP_CODEWORD = 'sleep';
    	const DROPZONE_AFTER_OFF_CODEWORD = 'off';
    	
    	const GET_PIC_ON_DROPZONE_LOGIC_CODEWORD = 'logic';
    	const GET_PIC_ON_DROPZONE_INDEX_CODEWORD = 'index';
    	
    	/*
    	    //---- SETTINGS STRUCTURES
    		
    		//--USEFUL PICS
    			//-CREATE USEFUL PIC:
    		let picSettings = {
    			id: 1,
    			mark: '',
    			isHoverable: true,
    			onHoverCommonEventId: 32,
    			isClickableLeft: true,
    			onLeftClickCommonEventId: 33,
    			isMovable: true,
    			moveSpeed: 60,
    			onDropzoneCommonEventId: 37
    		}
    		createUsefulPicture(picSettings);
    			//-UPDATE USEFUL PIC:
    		updateUsefulPicture(1, [[mark: 'aasd'], [isHoverable: false]])
    			//-DELETE  USEFUL PIC
    		deleteUsefulPicture(1);
    		
    		//--DROPZONES
    			//-CREATE DROPZONE
    		let dropzoneSettings = {
    			id: 1,
    			mark: '',
    			dropState: 'active', 'sleep'
    			dropType: 'free', 'lock' //LOCK
    			dropAfter: 'work', 'off'
    			onDropCommonEventId: 35
    		}
    		createDropzone(dropzoneSettings);
    			//-UPDATE DROPZONE:
    		updateDropzone(1, [[mark: 'aasd'], [dropMode: part]])
    			//-DELETE  DROPZONE
    		deleteDropzone(1);
    		
    		//--DEMO INGAME TEST
    		45 = red dropzone
    		34   = yellow drpzone
    		21  = black pic
    		11 = blue picture
    		1  = green pic
    	*/
    	
    //----DATA: END	
    		
    	
    //----PLUGIN LOGIC: BEGIN	
    
    	//---USEFUL PICTURES (HOVER AND CLICK)
    	//--create
    	const createUsefulPicture = (usefulPicSettings) => {
    		let usefulPicsList = $gameVariables.value(usefulPicturesListVarId) || [];
    		if(-1 === usefulPicsList.indexOf(usefulPicSettings)){
    			usefulPicsList.push(usefulPicSettings);
    			$gameVariables.setValue(usefulPicturesListVarId, usefulPicsList);
    		}
    	}
    	
    	//--update
    	const updateUsefulPicture = (usefulPicId, listOfSettingsToUpdate) => {
    		let usefulPic = getUsefulPicture(usefulPicId);
    		
    		if(null === usefulPic || undefined === usefulPic){
    			console.log('DKR.UsefulPictures_ERROR: USEFUL PIC ARE NOT EXIST! Id:', usefulPicId);
    			return;
    		}else{
    			for(let n = 0; n < listOfSettingsToUpdate.length; n++){
    				let currSettingName = listOfSettingsToUpdate[n][0];
    				let currSettingValue = listOfSettingsToUpdate[n][1];
    				if( false === usefulPic.hasOwnProperty  ){
    					console.log('DKR.UsefulPictures_ERROR: SETTINGS ARE NOT EXIST!');
    				}else{
    					usefulPic[currSettingName] = currSettingValue;
    				}
    			}
    			let index = getUsefulPictureIndexIn(usefulPicId);
    			let usefulPicsList = $gameVariables.value(usefulPicturesListVarId) || [];
    			usefulPicsList[index] = usefulPic;
    			$gameVariables.setValue(usefulPicturesListVarId, usefulPicsList);
    		}
    		
    	}
    	
    	//--get
    	const getUsefulPicture = (usefulPicId) => {
    		let usefulPic = null;
    		let usefulPicsList = $gameVariables.value(usefulPicturesListVarId) || [];
    		
    		usefulPic = usefulPicsList.filter(pic => pic.id === usefulPicId)[0];
    		
    		return usefulPic;
    	}
    	
    	//--delete
    	const deleteUsefulPicture = (usefulPicId) => {
    		let index = getUsefulPictureIndexIn(usefulPicId);
    		let usefulPicsList = $gameVariables.value(usefulPicturesListVarId) || [];
    		
    		delete usefulPicsList[index];
    		usefulPicsList = usefulPicsList.filter(pic => pic === pic);
    		$gameVariables.setValue(usefulPicturesListVarId, usefulPicsList);
    		
    		deleteUsefulPicOrDropzoneFromVault(usefulPicId, true);
    	}
    	
    	//--get index in
    	const getUsefulPictureIndexIn = (usefulPicId) => {
    		let innerIndex = -1;
    		let usefulPicsList = $gameVariables.value(usefulPicturesListVarId) || [];
    		
    		for(let n = 0; n < usefulPicsList.length; n++){
    			if(usefulPicId === usefulPicsList[n].id){
    				innerIndex = n;
    			}
    		}
    		
    		return innerIndex;
    	}
    	//---
    	
    	
    	//---DROPZONES (USEFUL PICTURES DETECTORS)
    	//-create
    	const createDropzone = (dropzoneSettings) => {
    		let dropzonesList = $gameVariables.value(dropzonesListVarId) || [];
    		if(-1 === dropzonesList.indexOf(dropzoneSettings)){
    			dropzonesList.push(dropzoneSettings);
    			$gameVariables.setValue(dropzonesListVarId, dropzonesList);
    		}
    	}
    	
    	//--update
    	const updateDropzone = (dropzoneId, listOfSettingsToUpdate) => {
    		let dropzone = getDropzone(dropzoneId);
    		
    		if(null === dropzone || undefined === dropzone){
    			console.log('DKR.UsefulPictures_ERROR: DROPZONE ARE NOT EXIST!');
    			return;
    		}else{
    			for(let n = 0; n < listOfSettingsToUpdate.length; n++){
    				let currSettingName = listOfSettingsToUpdate[n][0];
    				let currSettingValue = listOfSettingsToUpdate[n][1];
    				if( false === dropzone.hasOwnProperty  ){
    					console.log('DKR.UsefulPictures_ERROR: SETTINGS ARE NOT EXIST!');
    				}else{
    					dropzone[currSettingName] = currSettingValue;
    				}
    			}
    			
    			let dropzonesList = $gameVariables.value(dropzonesListVarId) || [];
    			let index = getDropzoneIndexIn(dropzoneId);
    			dropzonesList[index] = dropzone;
    			$gameVariables.setValue(dropzonesListVarId, dropzonesList);
    		}
    		
    	}
    	
    	//--get
    	const getDropzone = (dropzoneId) => {
    		let dropzone = null;
    		let dropzonesList = $gameVariables.value(dropzonesListVarId) || [];
    	
    		dropzone = dropzonesList.filter(dropzone => dropzone.id === dropzoneId)[0];
    		
    		return dropzone;
    	}
    	
    	//--delete
    	const deleteDropzone = (dropzoneId) => {
    		let index = getDropzoneIndexIn(dropzoneId);
    		let dropzonesList = $gameVariables.value(dropzonesListVarId) || [];
    		
    		delete dropzonesList[index];
    		dropzonesList = dropzonesList.filter(dropzone => dropzone === dropzone);
    		$gameVariables.setValue(dropzonesListVarId, dropzonesList);
    		
    		deleteUsefulPicOrDropzoneFromVault(dropzoneId, false);
    	}
    	
    	//--is contain usefulPic in dropzone
    	const isUsefulPicInDropzones = (gamePictureCoordsList) => {
    		let matchedDropzone = null;
    		let xCoord = gamePictureCoordsList[0];
    		let yCoord = gamePictureCoordsList[1];
    		
    		let gamePicturesList = $gameScreen._pictures;
    		for(let n = 1; n < gamePicturesList.length; n++){ //pictures start with 1!!!
    			
    			if(-1 !== getDropzone(n) ){
    				
    				let currentDropzone = getDropzone(n);
    				if(null !== currentDropzone && undefined !== currentDropzone){
    					let dropzonePicWidthAndHeight = getPictureWidthAndHeight(n);
    					
    					let dropzoneBeginX = gamePicturesList[n]._x;
    					let dropzoneBeginY = gamePicturesList[n]._y;
    					let dropzoneEndX = dropzoneBeginX + dropzonePicWidthAndHeight[0];
    					let dropzoneEndY = dropzoneBeginY + dropzonePicWidthAndHeight[1];
    					
    					let isInDropzone = isDestinationCoordInDropzone(xCoord, yCoord, dropzoneBeginX, dropzoneBeginY, dropzoneEndX, dropzoneEndY);
    					
    					if(true === isInDropzone){
    						matchedDropzone = currentDropzone;
    					}
    				}
    				
    			}
    			
    		}
    		
    		return matchedDropzone;
    	}
    	
    	const isDestinationCoordInDropzone = (clickX, clickY, dropzoneBeginX, dropzoneBeginY, dropzoneEndX, dropzoneEndY) => {
    		let isInDropZone = false;
    		
    		if(
    			( clickX >= dropzoneBeginX && clickX <= dropzoneEndX ) &&
    			( clickY >= dropzoneBeginY && clickY <= dropzoneEndY )
    		){
    			isInDropZone = true;
    		}
    		
    		return isInDropZone;
    	}
    	
    	//--get index in
    	const getDropzoneIndexIn = (dropzoneId) => {
    		let innerIndex = -1;
    		let dropzonesList = $gameVariables.value(dropzonesListVarId) || [];
    		
    		for(let n = 0; n < dropzonesList.length; n++){
    			if(dropzoneId === dropzonesList[n].id){
    				innerIndex = n;
    			}
    		}
    		
    		return innerIndex;
    	}
    	//---
    	
    	
    	//---VAULT OF USEFUL PICS ON DROPZONES (STORAGE FOR USEFUL PICTURES ON DROPZONES)
    		//if one in Vault - FOREVER in vault!
    		
    	//--add
    	const addUsefulPicOnDropzoneToVault = (usefulPicId, dropzoneId) => {
    		let vaultObj = null;
    		let vaultObjIndex = isAlreadyInVault(usefulPicId, dropzoneId);
    		let usefulPicsOnDropzonesVault = $gameVariables.value(vaultListVarId) || [];
    		
    		if(-1 === vaultObjIndex){
    			vaultObj = {usefulPicId, dropzoneId, isOn: true};
    			usefulPicsOnDropzonesVault.push(vaultObj);
    			$gameVariables.setValue(vaultListVarId, usefulPicsOnDropzonesVault);
    		}else{
    			vaultObj = getVaultObj(usefulPicId, dropzoneId);
    			vaultObj.isOn = true;
    			usefulPicsOnDropzonesVault[vaultObjIndex] = vaultObj;
    			$gameVariables.setValue(vaultListVarId, usefulPicsOnDropzonesVault);
    		}
    	}
    	
    	//--remove (off)
    	const removeUsefulPicOnDropzoneFromVault = (usefulPicId) => {
    		let dropzonesList = $gameVariables.value(dropzonesListVarId) || [];
    		let usefulPicsOnDropzonesVault = $gameVariables.value(vaultListVarId) || [];
    		
    		let vaultObj = null;
    		for(let n = 0; n < dropzonesList.length; n++){
    			let dropzoneId = dropzonesList[n].id;
    			let vaultObjIndex = isAlreadyInVault(usefulPicId, dropzoneId);
    			if(-1 === vaultObjIndex){
    				continue;
    			}else{
    				vaultObj = getVaultObj(usefulPicId, dropzoneId);
    				vaultObj.isOn = false;
    				usefulPicsOnDropzonesVault[vaultObjIndex] = vaultObj;
    				$gameVariables.setValue(vaultListVarId, usefulPicsOnDropzonesVault);
    			}
    		}	
    	}
    	
    	//--delete (full delete from vault)
    	const deleteUsefulPicOrDropzoneFromVault = (someId, isDeleteUsefulPic) => {
    		let toDelIndexesList = [];
    		let usefulPicsOnDropzonesVault = $gameVariables.value(vaultListVarId) || [];
    		
    		let vaultObj = null;
    		for(let n = 0; n < usefulPicsOnDropzonesVault.length; n++){
    			vaultObj = usefulPicsOnDropzonesVault[n];
    			if(true === isDeleteUsefulPic){
    				if(someId === vaultObj.usefulPicId){
    					toDelIndexesList.push(n);
    				}
    			}else{
    				if(someId === vaultObj.dropzoneId){
    					toDelIndexesList.push(n);
    				}
    			}
    		}
    		
    		for(let m = 0; m < toDelIndexesList.length; m++){
    			let currToDelIndex = toDelIndexesList[m];
    			delete usefulPicsOnDropzonesVault[currToDelIndex];
    		}
    		
    		usefulPicsOnDropzonesVault = usefulPicsOnDropzonesVault.filter(someVaultObj => someVaultObj === someVaultObj);
    		$gameVariables.setValue(vaultListVarId, usefulPicsOnDropzonesVault);
    	}
    	
    	//--get
    	const getVaultObj = (usefulPicId, dropzoneId) => {
    		let vaultObj = null;
    		let vaultObjIndex = isAlreadyInVault(usefulPicId, dropzoneId);
    		let usefulPicsOnDropzonesVault = $gameVariables.value(vaultListVarId) || [];
    		
    		if( -1 !== vaultObjIndex ){
    			vaultObj = usefulPicsOnDropzonesVault[vaultObjIndex];
    		}
    		
    		return vaultObj;
    	}
    	
    	//--search
    	const isAlreadyInVault = (usefulPicId, dropzoneId) => {
    		let isInVault = -1;
    		let usefulPicsOnDropzonesVault = $gameVariables.value(vaultListVarId) || [];
    		
    		for(let n = 0; n < usefulPicsOnDropzonesVault.length; n++){
    			let currentVaultObj = usefulPicsOnDropzonesVault[n];
    			if(usefulPicId === currentVaultObj.usefulPicId && dropzoneId === currentVaultObj.dropzoneId){ // && true === currentVaultObj.isOn
    				isInVault = n;
    			}
    		}
    		
    		return isInVault;
    	}
    	
    	//--for outer code (... .isUsefulPicOnDropzones)
    	const isUsefulPictureOnDropzones = (usefulPicId, resultType) => {
    		let result = false;
    		let dropzoneIndex = -1;
    		let usefulPicsOnDropzonesVault = $gameVariables.value(vaultListVarId) || [];
    		
    		for(let n = 0; n < usefulPicsOnDropzonesVault.length; n++){
    			let currentVaultObj = usefulPicsOnDropzonesVault[n];
    			if(usefulPicId === currentVaultObj.usefulPicId && true === currentVaultObj.isOn){
    				dropzoneIndex = currentVaultObj.dropzoneId
    				break;
    			}
    		}
    		
    		if(GET_PIC_ON_DROPZONE_LOGIC_CODEWORD === resultType){
    			if(-1 === dropzoneIndex){
    				result = false;
    			}else{
    				result = true;
    			}
    		}else if(GET_PIC_ON_DROPZONE_INDEX_CODEWORD === resultType){
    			result = dropzoneIndex;
    		}else{
    			console.log('DKR.UsefulPictures_ERROR: RESULT VARIANT ARE NOT EXIST!:', resultType);
    		}
    
    		return result;
    	}
    	
    	//--for outer code (... .isUsefulPicOnConcreteDropzone)
    	const isUsefulPictureOnConcreteDropzone = (usefulPicId, dropzoneId) => {
    		let result = false;
    		let usefulPicsOnDropzonesVault = $gameVariables.value(vaultListVarId) || [];
    		
    		for(let n = 0; n < usefulPicsOnDropzonesVault.length; n++){
    			let currentVaultObj = usefulPicsOnDropzonesVault[n];
    			if(usefulPicId === currentVaultObj.usefulPicId && dropzoneId === currentVaultObj.dropzoneId && true === currentVaultObj.isOn){ // 
    				result = true;
    				break;
    			}
    		}
    		
    		return result;
    	}
    	
    	//--for outer code (... .getUsefulPicsOnDropzone)
    	const getUsefulPicturesFromDropzone = (dropzoneId) => {
    		let usefulPicsOnDropzoneList = [];
    		let usefulPicsOnDropzonesVault = $gameVariables.value(vaultListVarId) || [];
    		
    		let vaultObjectsOnDropzone = [];
    		for(let n = 0; n < usefulPicsOnDropzonesVault.length; n++){
    			let currentVaultObj = usefulPicsOnDropzonesVault[n];
    			if(dropzoneId === currentVaultObj.dropzoneId && true === currentVaultObj.isOn){
    				vaultObjectsOnDropzone.push(currentVaultObj);
    			}
    		}
    		
    		for(let m = 0; m < vaultObjectsOnDropzone.length; m++){
    			let currentVaultObj = vaultObjectsOnDropzone[m];
    			let currentUsefulPicture = getUsefulPicture(currentVaultObj.usefulPicId);
    			usefulPicsOnDropzoneList.push(currentUsefulPicture  );
    		}
    		$gameVariables.setValue(vaultListVarId, usefulPicsOnDropzonesVault);
    
    		return usefulPicsOnDropzoneList;
    	}
    	//---
    	
    	
    	//---UTILS
    	const setPictureIdToVariable = (picId, varId) =>{
    		if(varId > 0){
    			$gameVariables.setValue(varId, picId);
    		}
    	}
    	
    //----PLUGIN LOGIC: END
    	
    	
    	
    //----MAKER !!! MOUSE !!! LOGIC: BEGIN	
    	//---DISABLE MOUSE STANDARD BEHAVIOUR
    	const disableMouseStandardBehaviour = () =>{
    		Game_Temp.prototype.setDestination = function(x, y) {};
    		Scene_Map.prototype.isMenuCalled = function() {
    			return Input.isTriggered('menu');
    		};
    		//isDefaultLRMCWork = false;
    		let isDefaultLRMCWork = false;
    		$gameSwitches.setValue(defaultLRMCWorkSwitchId, isDefaultLRMCWork);
    	}
    	
    	//---ENABLE MOUSE STANDARD BEHAVIOUR
    	const enableMouseStandardBehaviour = () =>{
    		Game_Temp.prototype.setDestination = function(x, y) {
    			this._destinationX = x;
    			this._destinationY = y;
    		};
    		Scene_Map.prototype.isMenuCalled = function() {
    			return Input.isTriggered("menu") || TouchInput.isCancelled();
    		};
    		//isDefaultLRMCWork = true;
    		let isDefaultLRMCWork = true;
    		$gameSwitches.setValue(defaultLRMCWorkSwitchId, isDefaultLRMCWork);
    		//--for cancel picture movement
    		pictureToMoveId = -1;
    		pictureToMoveSpeed = -1;
    		touchedDropzoneId = -1;
    	}
    	
    
    	//---ON HOVER
    	Sprite_Clickable.prototype.onMouseEnter = function() {
    		try{
    			let pic = this.picture();
    			let picId = $gameScreen._pictures.indexOf(pic);
    				
    			let usefulPictureSettings = getUsefulPicture(picId);
    			if(null == usefulPictureSettings){ 
    				console.log('DKR.UsefulPictures_ERROR: HOVER__USEFUL PICTURE NOT EXIST OR NOT SET!');
    			}else{
    				if(true === usefulPictureSettings.isHoverable && usefulPictureSettings.onHoverCommonEventId > 0){
    					setPictureIdToVariable(picId, lastHoveredPicVarId);
    					$gameTemp.reserveCommonEvent(usefulPictureSettings  .onHoverCommonEventId);
    				}
    			}	
    		}catch(exception){
    			//console.log('DKR.UsefulPictures_ERROR: onMouse-Enter: ERROR');
    			//console.log(exception);
    		}
    		
    	}
    	
    	//---ON PICTURE CLICK FOR LMC...TO CHOOSE OR CE
    	Sprite_Clickable.prototype.onClick = function() {
    		let isDefaultLRMCWork = $gameSwitches.value(defaultLRMCWorkSwitchId);
    		if(true === isDefaultLRMCWork){
    			console.log('DKR.UsefulPictures_INFO: isDefaultLRMCWork IS ON, CANT WORK!');
    			return;
    		}
    		try{
    			let pic = this.picture();
    			let picId = $gameScreen._pictures.indexOf(pic);
    
    			let usefulPictureSettings = getUsefulPicture(picId);
    			if(null == usefulPictureSettings || undefined == usefulPictureSettings){
    				console.log('DKR.UsefulPictures_ERROR: LMC__USEFUL PICTURE NOT EXIST OR NOT SET! Id:', picId);
    			}else{
    				if(true === usefulPictureSettings.isClickableLeft && usefulPictureSettings.onLeftClickCommonEventId > 0){
    					setPictureIdToVariable(picId, lastClickedPicVarId);
    					$gameTemp.reserveCommonEvent(usefulPictureSettings  .onLeftClickCommonEventId);
    				}
    				if(true === usefulPictureSettings.isMovable){
    					pictureToMoveId = picId;
    					pictureToMoveSpeed = usefulPictureSettings.moveSpeed;
    				}
    			}
    			
    		}catch(exception){
    			console.log('DKR.UsefulPictures_ERROR: onMouse-Click: ERROR_USEFUL_PIC');
    			console.log(exception);
    		}
    	}
    	
    	//---ON NOT(!) PICTURE CLICK FOR LMC...FOR MOVE PICTURE
    	const leftMouseClickProcess = (clickEv) => {
    		let coordX = clickEv.clientX;
    		let coordY = clickEv.clientY;
    		
    		if(false === $gameSwitches.value(movableSwitchId)){
    			console.log('DKR.UsefulPictures_INFO: MOVEMENT DISABLE BY SWITCH!');
    			return;
    		}
    		
    		//--move Main part
    		if(-1 !== pictureToMoveId){
    
    			$gameScreen.movePicture(
    				pictureToMoveId, picToMoveOrigin, clickEv.clientX, clickEv.clientY, 
    				picToMoveScaleX, picToMoveScaleY, picToMoveOpacity, picToMoveBlendMode, pictureToMoveSpeed
    			);
    			setPictureIdToVariable(pictureToMoveId, lastMovedPicVarId);
    			
    			//--move Dropzone part
    			let dropzone = isUsefulPicInDropzones([clickEv.clientX, clickEv.clientY]);
    			let usefulPicture = getUsefulPicture(pictureToMoveId);
    			
    			removeUsefulPicOnDropzoneFromVault(pictureToMoveId  );	
    			
    			if(null !== dropzone && undefined !== dropzone && dropzone.mark === usefulPicture.mark && DROPZONE_STATE_SLEEP_CODEWORD !== dropzone.dropState){
    
    				setPictureIdToVariable(pictureToMoveId, lastDroppedPicVarId);
    				setPictureIdToVariable(dropzone.id, lastUsedDropzoneVarId);
    				addUsefulPicOnDropzoneToVault(usefulPicture.id, dropzone.id);
    				
    				if(DROPZONE_TYPE_LOCK_CODEWORD === dropzone.dropType){
    					updateUsefulPicture(pictureToMoveId, [ ['isMovable', false], ['isClickableLeft', false], ['onLeftClickCommonEventId', 0] ]);
    				}
    				if(usefulPicture.onDropzoneCommonEventId > 0){
    					$gameTemp.reserveCommonEvent(usefulPicture.onDropz  oneCommonEventId);
    				}
    				if(dropzone.onDropCommonEventId > 0){
    					$gameTemp.reserveCommonEvent(dropzone.onDropCommon  EventId);
    				}
    				if(DROPZONE_AFTER_OFF_CODEWORD === dropzone.dropAfter){
    					updateDropzone(dropzone.id, [['dropState', 'sleep']]);
    				}
    				
    			}
    			
    		    //--for clear picture movement
    			pictureToMoveId = -1;
    			pictureToMoveSpeed = -1;
    			touchedDropzoneId = -1;
    		}
    		
    	}
    	
    	//---ON CLICK FOR RMC...CANCEL PICTURE MOVEMENT OR CE
    	const rightMouseClickProcess = () => {
    		let isDefaultLRMCWork = $gameSwitches.value(defaultLRMCWorkSwitchId);
    		if(true === isDefaultLRMCWork){
    			console.log('DKR.UsefulPictures_INFO: isDefaultLRMCWork IS ON, CANT WORK!');
    			return;
    		}
    		if(rightMouseClickEventId > 0){
    			$gameTemp.reserveCommonEvent(rightMouseClickEventI  d);
    		}
    		//--for cancel picture movement
    		pictureToMoveId = -1;
    		pictureToMoveSpeed = -1;
    		touchedDropzoneId = -1;
    	}
    	
    	//---ON CLICK ON MMC...CIRCLE...FOR CE
    	const middleMouseClickProcess = () => {
    		let isDefaultLRMCWork = $gameSwitches.value(defaultLRMCWorkSwitchId);
    		if(true === isDefaultLRMCWork){
    			console.log('DKR.UsefulPictures_INFO: isDefaultLRMCWork IS ON, CANT WORK!');
    			return;
    		}
    		if(middleMouseClickEventId > 0){
    			$gameTemp.reserveCommonEvent(middleMouseClickEvent  Id);
    		}
    	}
    	
    	
    	//---FOR CLICK: DETECT L-R-M CLICKS
    	TouchInput._onMouseDown = function(event) {
    		if (event.button === 0) {
    			this._onLeftButtonDown(event);
    			leftMouseClickProcess(event);
    		} else if (event.button === 1) {
    			this._onMiddleButtonDown(event);
    			middleMouseClickProcess();
    		} else if (event.button === 2) {
    			this._onRightButtonDown(event);
    			rightMouseClickProcess();
    		}
    	};
    	
    	//---FOR GET PICTURE WIDTH AND HEIGHT
    	const getPictureWidthAndHeight = (pictureId) => {
    		let pictureHeightAndWidth = [-1, -1];
    		
    		try{
    			let picsSpritesetList = SceneManager._scene._spriteset.children.find(obj => obj.children.length >= 99);
    			let pictureSprite = picsSpritesetList.children[pictureId - 1];
    			let pictureWidth =  pictureSprite.width;
    			let pictureHeight =  pictureSprite.height;
    			
    			pictureHeightAndWidth = [pictureWidth, pictureHeight];
    		}catch(exception){
    			console.log('DKR.UsefulPictures_ERROR: getPictureWidthAndHeight: ERROR | pic_id:', pictureId);
    			console.log(exception);
    		}
    		
    		return pictureHeightAndWidth;
    	}
    //----MAKER LOGIC: END		
    	
    	
    	
    //----COMMANDS: BEGIN		
    	//--on/off default left right mouse click
    	DKR.UsefulPictures.disableLRMC = function(){
    		disableMouseStandardBehaviour();
    	}
    	
    	DKR.UsefulPictures.enableLRMC = function(){
    		enableMouseStandardBehaviour();
    	}
    	//--
    	
    	//--set Common events to right muse click and middel mouse click
    	DKR.UsefulPictures.setCommonEventToRMC = function(ceId){
    		rightMouseClickEventId = ceId;
    	}
    	
    	DKR.UsefulPictures.setCommonEventToMMC = function(ceId){
    		middleMouseClickEventId = ceId;
    	}
    	//--
    	
    	//-create/update/delete useful pictures
    	DKR.UsefulPictures.testUsefulPics = function(){
    		let usefulPicsList = $gameVariables.value(usefulPicturesListVarId) || [];
    		console.log('_usefulPicsList:', usefulPicsOnDropzonesVault);
    	}
    	
    	DKR.UsefulPictures.createUsefulPic = function(picSettings){
    		createUsefulPicture(picSettings);
    	}
    	
    	DKR.UsefulPictures.getUsefulPic = function(usefulPicId){
    		return getUsefulPicture(usefulPicId);
    	}
    	
    	
    	DKR.UsefulPictures.updateUsefulPic = function(usefulPicId, listOfSettingsToUpdate){
    		updateUsefulPicture(usefulPicId, listOfSettingsToUpdate);
    	}
    	
    	DKR.UsefulPictures.deleteUsefulPic = function(usefulPicId){
    		deleteUsefulPicture(usefulPicId);
    	}
    	//--
    	
    	//-create/update/delete dropzones
    	DKR.UsefulPictures.testDropzones = function(){
    		let dropzonesList = $gameVariables.value(dropzonesListVarId) || [];
    		console.log('_dropzonesList:', dropzonesList);
    	}
    	
    	DKR.UsefulPictures.createDropZone = function(dropzoneSettings){
    		createDropzone(dropzoneSettings);
    	}
    	
    	DKR.UsefulPictures.getDropZone = function(dropzoneId){
    		return getDropzone(dropzoneId);
    	}
    	
    	DKR.UsefulPictures.updateDropZone = function(dropzoneId, listOfSettingsToUpdate){
    		updateDropzone(dropzoneId, listOfSettingsToUpdate);
    	}
    	
    	DKR.UsefulPictures.deleteDropZone = function(dropzoneId){
    		deleteDropzone(dropzoneId);
    	}
    	//--
    	
    	//--get informtation about useful pictures on dropzones
    	DKR.UsefulPictures.testVault = function(){
    		let usefulPicsOnDropzonesVault = $gameVariables.value(vaultListVarId) || [];
    		console.log(usefulPicsOnDropzonesVault);
    	}
    	
    	DKR.UsefulPictures.isUsefulPicOnDropzones = function(usefulPicId, logicOrIndex){
    		return isUsefulPictureOnDropzones(usefulPicId, logicOrIndex);
    	}
    	
    	DKR.UsefulPictures.isUsefulPicOnConcreteDropzone = function(usefulPicId, dropzoneId){
    		return isUsefulPictureOnConcreteDropzone(usefulPicId, dropzoneId);
    	}
    	
    	DKR.UsefulPictures.getUsefulPicsFromDropzone = function(dropzoneId){
    		return getUsefulPicturesFromDropzone(dropzoneId);
    	}
    	//--
    	
    //----COMMANDS: END		
    
    } )();


    Загрузка:


    Условия поставки плагина:
    Поставляется AS-IS.
    Вся ответственность при использовании - на Пользователе!
    !

    Совместимость:
    Плагин существенно меняет логику работы мыши и частично - картинок.
    Совместимость с другими плагинами на мышь - отсутствует.
    Совместимость с другими плагинами на картинки - не гарантируется.
    С другой стороны - плагин совместим с DKR_EntityCustomData.

    Спойлер Лирическое отступление:
    Наверное, "вершина эволюции" моих экспериментов с картинками, на которые можно тыкать.
    Мы же двигаем картинки по экрану, по сути?
    Теперь можно двигать по факту. =)
    Доберется ли проклятие карточных рогаликов до мейкера? Кто знает...

    Обратите внимание - без просмотра демки работа и настройка плагина может быть не ясна.
    Это издержки подобия универсальности (в моем исполнении). =(


    Благодарности:
    за идею/вдохновение
    nirion , VarVarKa , Green-Leo , Петр .
    специальные благодарности:
    Phileas за идею работы над плагинами, Krimer за методику определения габаритов картинки.
    Последний раз редактировалось Darchan Kaen; 22.01.2022 в 16:46. Причина: Добавлен еще один важный нюанс!

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
[MZ]DKR_UsefulPictures